package com.lw.service;

import com.lw.dto.Exposer;
import com.lw.dto.SecKillExecution;
import com.lw.entity.SecKill;
import com.lw.exception.RepeatSecKillException;
import com.lw.exception.SecKillCloseException;
import com.lw.exception.SecKillException;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * Created by IntelliJ IDEA
 *
 * @Author L1W31
 * @Date 2021/8/3 20:33
 * @Version 1.0
 * @Description 业务接口：站在“使用者”的角度设计接口
 *              三个方面：
 *                  1.方法定义粒度，方法定义的要非常清楚
 *                  2.参数，要越简练越好
 *                  3.返回类型(return 类型一定要友好/或者return异常，我们允许的异常)
 */
public interface SecKillService {

    /**
    * @Description: 查询所有秒杀记录
    * @Param: []
    * @return: 所有秒杀记录列表
    */
    List<SecKill> getSecKillList ();

    /**
    * @Description: 根据id查询秒杀记录
    * @Param: [secKillId]
    * @return:
    */
    SecKill getSecKillById (@Param("secKillId") long secKillId);

    /**
    * @Description: 秒杀开启时输出秒杀地址，否则输出系统时间和秒杀时间
    * @Param: [secKillId]
    * @return:
    */
    Exposer exportSecKillUrl (@Param("secKillId") long secKillId);

    /**
    * @Description: 执行秒杀操作，通知接口使用者秒杀业务的异常
    * @Param: [secKillId, userPhone, md5]
    * @return:
    */
    SecKillExecution executeSecKill (@Param("secKillId") long secKillId, @Param("userPhone") long userPhone, @Param("md5") String md5)
            throws SecKillException, RepeatSecKillException, SecKillCloseException;
}
